15.8 正则表达式

我们在 Kotlin 中除了仍然可以使用 Java中的 Pattern,Matcher 等类之外,Kotlin 还提供了一个正则表达式类 kotlin/text/regex/Regex.kt ,我们通过 Regex 的构造函数来创建一个正则表达式。

15.8.1 构造 Regex 表达式

使用Regex构造函数

  1. >>> val r1 = Regex("[a-z]+")
  2. >>> val r2 = Regex("[a-z]+", RegexOption.IGNORE_CASE)

其中的匹配选项 RegexOption 是直接使用的 Java 类 Pattern中的正则匹配选项。

使用 String 的 toRegex 扩展函数

  1. >>> val r3 = "[A-Z]+".toRegex()

15.8.2 Regex 函数

Regex 里面提供了丰富的简单而实用的函数,如下表所示

函数名称 功能说明
matches(input: CharSequence): Boolean 输入字符串全部匹配
containsMatchIn(input: CharSequence): Boolean 输入字符串至少有一个匹配
matchEntire(input: CharSequence): MatchResult? 输入字符串全部匹配,返回一个匹配结果对象
replace(input: CharSequence, replacement: String): String 把输入字符串中匹配的部分替换成replacement的内容
replace(input: CharSequence, transform: (MatchResult) -> CharSequence): String 把输入字符串中匹配到的值,用函数 transform映射之后的新值替换
find(input: CharSequence, startIndex: Int = 0): MatchResult? 返回输入字符串中第一个匹配的值
findAll(input: CharSequence, startIndex: Int = 0): Sequence<MatchResult> 返回输入字符串中所有匹配的值MatchResult的序列

下面我们分别就上面的函数给出简单实例。

matches

输入字符串全部匹配正则表达式返回 true , 否则返回 false。

  1. >>> val r1 = Regex("[a-z]+")
  2. >>> r1.matches("ABCzxc")
  3. false
  4. >>>
  5. >>> val r2 = Regex("[a-z]+", RegexOption.IGNORE_CASE)
  6. >>> r2.matches("ABCzxc")
  7. true
  8. >>> val r3 = "[A-Z]+".toRegex()
  9. >>> r3.matches("GGMM")
  10. true

containsMatchIn

输入字符串中至少有一个匹配就返回true,没有一个匹配就返回false。

  1. >>> val re = Regex("[0-9]+")
  2. >>> re.containsMatchIn("012Abc")
  3. true
  4. >>> re.containsMatchIn("Abc")
  5. false

matchEntire

输入字符串全部匹配正则表达式返回 一个MatcherMatchResult对象,否则返回 null。

  1. >>> val re = Regex("[0-9]+")
  2. >>> re.matchEntire("1234567890")
  3. kotlin.text.MatcherMatchResult@34d713a2
  4. >>> re.matchEntire("1234567890!")
  5. null

我们可以访问MatcherMatchResult的value熟悉来获得匹配的值。

  1. >>> re.matchEntire("1234567890")?.value
  2. 1234567890

由于 matchEntire 函数的返回是MatchResult? 可空对象,所以这里我们使用了安全调用符号 ?.

replace(input: CharSequence, replacement: String): String

把输入字符串中匹配的部分替换成replacement的内容。

  1. >>> val re = Regex("[0-9]+")
  2. >>> re.replace("12345XYZ","abcd")
  3. abcdXYZ

我们可以看到,”12345XYZ”中12345是匹配正则表达式 [0-9]+的内容,它被替换成了 abcd

replace(input: CharSequence, transform: (MatchResult) -> CharSequence): String

把输入字符串中匹配到的值,用函数 transform映射之后的新值替换。

  1. >>> val re = Regex("[0-9]+")
  2. >>> re.replace("9XYZ8", { (it.value.toInt() * it.value.toInt()).toString() })
  3. 81XYZ64

我们可以看到,9XYZ8中数字9和8是匹配正则表达式[0-9]+的内容,它们分别被transform函数映射 (it.value.toInt() * it.value.toInt()).toString() 的新值 81 和 64 替换。

find

返回输入字符串中第一个匹配的MatcherMatchResult对象。

  1. >>> val re = Regex("[0-9]+")
  2. >>> re.find("123XYZ987abcd7777")
  3. kotlin.text.MatcherMatchResult@4d4436d0
  4. >>> re.find("123XYZ987abcd7777")?.value
  5. 123

findAll

返回输入字符串中所有匹配的值的MatchResult的序列。

  1. >>> val re = Regex("[0-9]+")
  2. >>> re.findAll("123XYZ987abcd7777")
  3. kotlin.sequences.GeneratorSequence@f245bdd

我们可以通过 forEach 循环遍历所以匹配的值

  1. >>> re.findAll("123XYZ987abcd7777").forEach{println(it.value)}
  2. 123
  3. 987
  4. 7777

15.8.3 使用 Java 正则表达式类

除了上面 Kotlin 提供的函数之外,我们在 Kotlin 中仍然可以使用 Java 的正则表达式的 API。

  1. val re = Regex("[0-9]+")
  2. val p = re.toPattern()
  3. val m = p.matcher("888ABC999")
  4. while (m.find()) {
  5. val d = m.group()
  6. println(d)
  7. }

上面的代码运行输出:

  1. 888
  2. 999